#ifndef __PID_H
#define __PID_H
#include "stdio.h"



typedef struct
{
	float Kp;          //差分环
	float Ki;          //积分环
  float Kd;          //微分环
	
  float max_out;  //输出限幅
	float max_iout; //积分限幅
	/**********************end*********************/
	
	
	/*******************内部参数*******************/
	float err;    //误差
	float err_next; //上次误差
	float err_last; //上上次误差
	float derr;//微分
	float dderr;//上次微分
	
	float out;                   //总输出
	float Pout;                  //P环输出
	float Iout;                  //I环输出
	float Dout;                  //D环输出
	/**********************end*********************/
}PidTypedef;

/**********************自写代码*********************/
typedef struct
{
   	float kp,ki,kd;//三个系数
	float set, fdb;//目标值，反馈值
    float error[3];//误差、上次误差，上上次误差
    float integral,maxIntegral;//积分、积分限幅
	float Pout,Iout,Dout;
    float output,maxOutput;//输出、输出限幅
	float output_last;    //上次的输出值
	float Dbuf[3];//微分项 0最新 1上一次 2上上次
}PID;

typedef struct
{
    PID inner;//内环
    PID outer;//外环
    float output;//串级输出，等于inner.output
}CascadePID;

///*定义前馈控制器的结构体*/
//typedef struct {
//	float rin;
//	float lastRin;
//	float perrRin;//rin为目标值
//	float output;
//}FFC;
/**********************自写代码*********************/


PidTypedef PidSet(float Kp,float Ki,float Kd,float max_out,float max_iout) ;
int LimitMax(int input,int max);
float PID_V(PidTypedef *pid,float set,float fdb);
/**********************自写代码*********************/
void PID_Init(PID *pid,float p,float i,float d,float maxI,float maxOut);
void PID_Calc(PID *pid,float reference,float feedback);
void PID_CascadeCalc(CascadePID *pid,float outerRef,float outerFdb,float innerFdb);

//void increment_pid(PID *pid,float reference,float feedback);
//void FeedforwardController(FFC vFFC);//前馈PID
/**********************自写代码*********************/
#endif
